package com.hua.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hua.pojo.Comment;
import com.hua.mapper.CommentMapper;
import com.hua.pojo.Food;
import com.hua.service.CommentService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hua.utils.CommentDetailDTO;
import com.hua.utils.CanteenCommentDTO;
import com.hua.utils.UserCommentDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author hua
 * @since 2023-12-24
 */
@Slf4j
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper, Comment> implements CommentService {


    @Autowired
    private CommentMapper commentMapper;
    @Autowired FoodServiceImpl foodService;
    //多表查询评论信息
    @Override
    public Map<String, Object> getCommentList(Integer foodId, Integer pageSize,Integer pageNo) {

        Integer offset=(pageNo - 1) * pageSize;//偏移量

        List<CommentDetailDTO> commentDetailDTOS = commentMapper.selectCommentDetailsByFoodIdWithPagination(foodId, pageSize,offset);
        // 创建结果 Map 对象，封装结果
        Map<String, Object> data = new HashMap<>();
        data.put("data", commentDetailDTOS);





        return data;


    }

    //新增用户评论
    /**
     * 新增用户评论（带有事务控制）
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addComment(Comment newComment) {
        try {
            /**①第一步：评论插入*/
            int inserted = this.baseMapper.insert(newComment);

            /**②第二步：插入成功更新该food的评分*/
            if (inserted == 1) {
                // 1. 做统计: 统计该菜品的所有评分，做平均数
                int ratingAverageValue = commentMapper.ratingAverageValue(newComment.getFoodId());
                // 2. 修改food表的comment评分字段
                Food updateFood = new Food();
                updateFood.setId(newComment.getFoodId());
                updateFood.setComment(ratingAverageValue);
                boolean b = foodService.updateById(updateFood);
                if (!b) {
                    log.error("更新食品评分失败");
                    throw new RuntimeException("更新食品评分失败"); // 抛出异常，触发事务回滚
                }
            }

            return inserted;//1
        } catch (Exception e) {
            log.error("新增用户评论时发生异常: "+e.getMessage());
            throw e; // 重新抛出异常，以便上层处理
        }
    }

    //用户评论自主删除（用户端）

    /**
     * 删除评论并更新食品评分（带有事务控制）
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int deleteCommentByCommentId(int commentID, int userId) {
        try {

            /**①第一步：获取要删除的comment,位立得到foodID*/

            Comment comment = this.baseMapper.selectById(commentID);
            /**②第二步：删除评论*/


            // 创建删除的条件
            QueryWrapper<Comment> wrapper = new QueryWrapper<>();
            wrapper.eq("user_id", userId); // 判断是否是该用户评论的
            wrapper.eq("id", commentID); // 寻找该评论记录

            // 执行删除
            int deleted = this.baseMapper.delete(wrapper);

            /**③第三步：删除成功后更新该food的评分*/
            if (deleted == 1) {


                // 2. 做统计: 统计该菜品的所有评分，做平均数
                int ratingAverageValue = commentMapper.ratingAverageValue(comment.getFoodId());
                // 3. 修改food表的comment评分字段
                Food updateFood = new Food();
                updateFood.setId(comment.getFoodId());
                updateFood.setComment(ratingAverageValue);
                boolean b = foodService.updateById(updateFood);
                if (!b) {
                    log.error("更新食品评分失败");
                    throw new RuntimeException("更新食品评分失败"); // 抛出异常，触发事务回滚
                }

            }

            return deleted;//1
        } catch (Exception e) {
            // 如果发生任何异常，事务将自动回滚
            log.error("删除评论并更新食品评分时发生异常: "+e.getMessage());
            throw e; // 重新抛出异常，以便上层处理
        }
    }

    /**
     * 用户删除评论，总管理员无限制删除，这里是管理员删除评论的API
     * */
    @Override
    public int deleteComment(int commentID) {
        return this.baseMapper.deleteById(commentID);
    }

    //管理者修改该评论是否展示
    @Override
    public int commentIsShow(int commentID, int isShow) {

        //封装对象
        Comment updateComment=new Comment();

        updateComment.setId(commentID);
        updateComment.setIsShow(isShow);

        //更新结果并返回
        return  this.baseMapper.updateById(updateComment);

    }


    //用户评论汇总,筛选出该用户的所有评论
    @Override
    public Map<String, Object> userAllComment(Integer userId) {
        List<UserCommentDTO> userCommentDTOList = commentMapper.selectUserComment(userId);
        // 创建结果 Map 对象，封装结果
        Map<String, Object> data = new HashMap<>();
        data.put("data", userCommentDTOList);

        return data;
    }

    //查询某个饭堂所有菜品的评论，返回：评论者的网名、菜名、打分、评论内容、评论时间、是否展示
    @Override
    public Map<String, Object> sthCanteenAllComment(Integer canteenID) {
        List<CanteenCommentDTO> canteenCommentDTOS = commentMapper.selectCanteenAllComment(canteenID);
        // 创建结果 Map 对象，封装结果
        Map<String, Object> data = new HashMap<>();
        data.put("data", canteenCommentDTOS);

        return data;
    }
}
